package com.ch07.container;

import java.lang.reflect.Field;

/**
 * @ClassName FieldInjectHandler
 * @Description 属性注入处理器
 * @Author Kx
 * @Date 2025/4/16 10:45
 * @Version 1.0
 */
public class FieldInjectHandler {

    /***
     * @author: kx
     * @date: 2025/4/16 10:46
     * @param bean : 对象
     * @param containerFactory : 容器工厂
     * @description: 属性注入
    */
    public void handle(Object bean, ContainerFactory containerFactory) {
        // 遍历对象中所有属性
        for (Field field : bean.getClass().getDeclaredFields()) {
            // 判断属性是否被注解标注
            if (field.isAnnotationPresent(Inject.class)) {
                // 获取注解的值
                String value = field.getAnnotation(Inject.class).value();

                // 从容器中获取这个对象
                Object injectObj = containerFactory.getBean(value);

                // 注入属性
                setValue(field, bean, injectObj);
            }
        }
    }

    /***
     * @author: kx
     * @date: 2025/4/16 10:52
     * @param field : 属性
     * @param bean : 对象
     * @param injectObj : 注入的值
     * @description: 注入属性
    */
    private void setValue(Field field, Object bean, Object injectObj) {
        try {
            // 判断属性是否是私有的
            if (!field.canAccess(bean)) {
                // 设置为可访问
                field.setAccessible(true);
            }
            // 注入属性
            field.set(bean, injectObj);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}
